clear; clc;
%%  参数定义  %%%%%%%%%%%
fs = 96000;             % 采样频率
bps = 16;               % 位深 bit
Tfile = 10;             % 声音片段的总时长,单位s, 可调整声音时长
vol = -5;                % 声音片段的音量 0db
stereo = 1;             % 0：单声道，1：立体声
% filename = ('96000_16b_1KHz_60s_stereo_440Hz.wav'); %输出文件名称（自己定义，后缀是.wav）
filename = ('220_440Hz.wav'); %输出文件名称（自己定义，后缀是.wav）
%% 生成时间序列
Df = 1;                 % 频率间隔，默认1
T = 1/fs;               % 采样周期
N = fs/Df;              % 序列点数
time = Tfile*(N-1)*T;   % 文件总时长
t = 0:T:time;           % 生成每一个采样点对应的时间序列
%% 声音频率设置，当随时间变化时，可生成频率变化的声音
if 1
    fs_a = 220;    % 国际标准音低八度频率，单位Hz
    fs_A = 440;    % 国际标准音频率
else
    fs_a = 1500*t/time+1000;   % 频率从 1000~2500
    fs_A = 0;
end
%% 生成左右声道波形
y1 = (sin(2*pi*fs_a.*t)+sin(2*pi*fs_A*t))*(db2mag(vol));    % 生成第一个声音片段，注意需要用db2mag()函数把dB转换成magnitude。
y2 = (sin(2*pi*fs_a.*t)+sin(2*pi*fs_A*t))*(db2mag(vol));    % 生成第二个声音片段，若需不同赋值，可以在参数定义中增加一个 vol_2 来控制第二段的赋值。 
if stereo == 0                                  % 选择单声道输出
        y = y1';                                %   输出的 y 只使用 y1， 左声道（单声道）
        y2 = 0*sin(2*pi*sinewave2_fs*t);        %   令 y2 为 0
else                                            % 选择立体声输出
        y = [y1',y2'];                          %   合成立体声
end
%% 通过电脑音频输出口，播放生成的波形
% whos y              % 命令行打印 y 的信息
% if fs < 192000      % 电脑不能支持大于 192K 的声音输出，但是可以正常生成。
%     sound(y,fs)     % 可以播放声音的函数 sound()
% end
%% 描绘波形图像
if stereo == 0              % 如果选择单声道输出 
    subplot(2,1,1);         %     选中第一个图片位置
    plot(t,y1);             %     描绘左声道生成波形
    title('左声道生成波形'); 
    subplot(2,1,2);         %     选中第二个图片位置
    plot(y1(1:200));        %     打印左声道 1~200的值，如果下面读取成功，此值会被覆盖
    title('左声道读取失败'); %     若后面读取正常，该值会被覆盖（即读取成功的话，将看不到这句话，用于验错）

else                        % 如果选择立体声输出 
    subplot(4,1,1);         %     选中第一个图片位置
    plot(t,y1);             %     描绘左声道生成波形
    title('左声道生成波形');
    subplot(4,1,2);         %     选中第二个图片位置
    plot(t,y2);             %     描绘右声道生成波形
    title('右声道生成波形');
    subplot(4,1,3);         %     选中第三个图片位置
    plot(y1(1:200))         %     打印左声道 1~200的值，如果下面读取成功，此值会被覆盖
    title('左声道读取失败');   %     若后面读取正常，该值会被覆盖（即读取成功的话，将看不到这句话，用于验错）
    subplot(4,1,4);         %     选中第四个图片位置
    plot(y2(1:200))         %     打印右声道 1~200的值，如果下面读取成功，此值会被覆盖
    title('右声道读取失败');   %     若后面读取正常，该值会被覆盖（即读取成功的话，将看不到这句话，用于验错）
end
%% 写入文件
audiowrite(filename,y,fs,'BitsPerSample',bps);  % 存储.wav音频文件，文件名在参数定义里设置
AudioInfo = audioinfo(filename)                 % 这里不用加分号，可以顺便在命令窗口看看写入文件的打印信息
%%   读取刚才生成的 wav 文件进行，并描绘波形
[y_read,FS]=audioread(filename);    % 将 WAV 文件转换成变量
whos y_r                            % 打印一下 y_read 信息
if stereo == 0                      % 如果选择单声道 
    y_read1 = y_read(:,1);          %	提取声道
    subplot(2,1,2);                 %	选中第二个图片位置
    plot(t,y_read1);                %   描绘左声道读取波形，覆盖上一步骤的验错内容
    title('左声道读取波形');
else                                % 如果选择立体声 
    y_read1 = y_read(:,1);          %	提取左声道
    subplot(4,1,3);                 %   选中第三个图片位置
    plot(t,y_read1);                %   描绘左声道读取波形，覆盖上一步骤的验错内容
    title('左声道读取波形');
    y_read2 = y_read(:,2);          %	提取右声道
    subplot(4,1,4);                 %   选中第四个图片位置
    plot(t,y_read2);                %   描绘右声道读取波形，覆盖上一步骤的验错内容
    title('右声道读取波形');
end
